/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.vse.adventura.po1715.xshet00_shevtsova.gui;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IUIG;

import cz.pecinovsky.english.pojj.adv_framework.game_txt.IGame;

import cz.pecinovsky.english.pojj.adv_framework.test_util._Test_101;
import cz.pecinovsky.english.pojj.adv_framework.test_util._Test_115;

import java.awt.BorderLayout;
import java.awt.Point;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.BoxLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;





/*******************************************************************************
 * Instance třídy {@code GUI_01} představují superjednoduché 
 * grafické uživatelsé rozhraní umožňující hrát hry
 * vyhovující podmínkám rámce (frameworku) definovaného v balíčku
 * {@code cz.pecinovsky.english.pojj.adv_framework.game_txt},
 * tj. textové hry vyhovující požadavkům minulého semestru. 
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   0.00.000
 */
public class GUI_02 implements IUIG
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
    
    /** Souřadnice, na které se aplikační okno přesune po spuštění GUI.
     *  To má smysl především při zobrazování na sekundárním monitoru. */
    private static final Point POINT_0 = new Point(-300, 0);   //-300, 0);
    
    /** Konstanty používané při formátování vystupujícího textu. */
    private static final String 
            PŘED_PŘÍKAZEM = "\n=============================================\n",
            ZA_PŘÍKAZEM   = "\n---------------------------------------------\n";
    
    
    
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

   
    /** Aplikační okno spuštěného GUI. */
    private final JFrame appWindow = new JFrame("První okno");
    
    /** Componenta, do které je zapisován text
     *  informující uživatele o průběhu hry. */
    private final JTextArea outputArea = new JTextArea(50, 50);
    
    /** Vstupní textové pole, do nějž uživatel zapisuje své příkazy. */
    private final JTextField inputField = new JTextField(25);
    
    
    /** Poslucha4 vstupniho pole.*/
    ActionListener inputListener= new TxfListener();
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
 /** Hra, která bude hrána prostřednictvím tohoto GUI. */
    private  IGame game;

    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří novou instanci GUI, která hned odstartuje 
     * komunikaci s hrou zadanou v parametru.
     * 
     * @param game Hra, se ktrou bude GUI komunikovat
     */
    public GUI_02()
    {
        appWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        prepareOutputArea();
        prepareBagPane();
        prepareInputField();

    }

  

    private GUI_02(Object object) {
        throw new UnsupportedOperationException("Not yet implemented");
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí jméno autora scénáře ve formátu <b>PŘÍJMENÍ Křestní</b>,
     * tj. neprve příjmení psané velkými písmeny a za ním křestní jméno,
     * u nějž bude velké pouze první písmeno a ostatní písmena budou malá.
     *
     * @return Jméno autora/autorky programu ve tvaru PŘÍJMENÍ Křestní
     */
    @Override
    public String getAuthor()
    {
       return "Shevtsova Tatyana";
    }


    /***************************************************************************
     * Vrátí x-name autora/autorky programu zapsané velkými písmeny.<p>
     * X-name má tvar <b>{@code XPPPK99}</b> nebo <b>{@code XPPPK999}</b>,
     * kde<br>
     * <ul>
     *   <li><b>{@code PPP}</b> zastupuje první tří písmena příjmení autora(ky)
     *      zapsaná velkými písmeny, </li>
     *   <li><b>{@code K}</b> zastupuje první písmeno křestního jména a </li>
     *   <li><b>{@code 99}</b>, resp. <b>{@code 999}</b> zastupují číslice
     *      přiřazené systémem, pomocí nichž se rozsliší studenti(ky)
     *      s předchozími znaky shodnými.
     * </ul>
     *
     * @return X-name autora/autorky programu
     */
    @Override
    public String getXNAME()
    {
        return "XSHET00";
    }


    /***************************************************************************
     * Spustí komunikaci mezi zadanou hrou a danou instancí GUI
     * mající na starosti komunikaci s uživatelem.
     * <p>
     * Metoda před pokusem o spuštění zadané hry nejprve zkontroluje,
     * že pomocí daného GUI není akutálně hrána žádná hra
     * a že ani zadaná hra není rozehrána. V opačném případě vyhodí výjimku.
     * <p>
     * Tato verze ještě není plnohodntou implementací, 
     * protože je schopna obsluhovat i hry implementující rozhraní 
     * a proto není pravda, že: "<i>nejprve však zkontroluje, 
     * že zadaná hra je ve skutečnosti instancí rozhraní {@link IGameG},
     * protože jiné neposkytují metody, které grafické UI očekává</i>".
     *
     * @param game Hra, kterou ma dané UI spustit
     * @throws IllegalArgumentException 
     *         Existují důvody, které brání spuštění zadané hry
     */
    @Override
    public void startGame(IGame game)
    {
    
     if ((this.game !=null)&& (! this.game.isReady())) {
         int answer = JOptionPane.showConfirmDialog(appWindow,
                 "V soucasne dobe je rozehrana hra"+ this.game.getClass()+
                 "Opravdu checete tuto hru ukoncit"+game.getClass());
         if(answer !=0) {
             return;
         }
     }
     if ((game==null) ||(! game.isReady())) {
         throw new RuntimeException (
                 "/Odkaz je prazdny nebo hra jeste bezi");
     }
     this.game = game;
     initialize();

inputField.setText("");
inputListener.actionPerformed(null);
    }


    /***************************************************************************
     * Spustí komunikaci mezi implicitní hrou a danou instancí
     * mající na starosti komunikaci s uživatelem.
     */
    @Override
    public void startGame()
    {
        IGame choosedGame =_Test_115.getDefaultGame();
      startGame(choosedGame);
    }


    /***************************************************************************
     * Zpracuje příkaz předaný v parametru jako by byl zadán standardním
     * postupem z klávesnice. Metoda umožňuje testovat reakce daného
     * uživatelského rozhraní na příkazy zadávané z klávesnice.
     *
     * @param command Zadávaný příkaz
     */
    @Override
    public void executeCommand(String command)
    {
        //TODO Operace ještě není implementována
        throw new UnsupportedOperationException("Prozatím neimplementováno");
    }

    private void initialize()
    {
        inicializeOutputArea();
        initializeInputField();
        initializeBagPane();

       //TODO Operace initialize() jeste neni implementovana
          appWindow.setVisible(true);
          appWindow.pack();

        //Následující posunutí má smysl pouze při zobrazování
        //na druhém monitoru, který je umístněn vlevo od hlavního
        appWindow.setLocation(POINT_0);


    }



//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
        private void initializeInputField() {
        //todo initializeInputField
    }

    private void inicializeOutputArea() {
       //todo inicializeOutputArea
       outputArea.setText("");
    }

    private void initializeBagPane() {
        throw new UnsupportedOperationException("Not yet implemented");
    }


      private void prepareBagPane()
      {
       Box pane = new Box(BoxLayout.X_AXIS);
       pane.add(new JLabel("=====Obsah Batohu====="));
       appWindow.add(pane, BorderLayout.WEST);
      }

    public void prepareOutputArea() {
        outputArea.setEditable(false);
        JScrollPane scroller =new JScrollPane(outputArea);
        appWindow.add(scroller, BorderLayout.CENTER);
    }

    public void prepareInputField() {
        inputField.addActionListener(new TxfListener());
        JPanel panel = new JPanel();
        JLabel label = new JLabel("Zadej prikaz:  ");
        panel.add(label);
        panel.add(inputField);

        appWindow.add(panel, BorderLayout.SOUTH);
    }

//== INTERNÍ DATOVÉ TYPY =======================================================
    
    /***************************************************************************
     * Vnitřní třída, jejíž instance představují posluchače
     * vstupního textového pole čekající na stisk klávesy {@code Enter}
     * v okamžiku, kdy má pole fokus.
     */
    private class TxfListener implements ActionListener
    {
        /***********************************************************************
         * Zjistí aktuální text ve vstupním poli (= text zadaného příkazu),
         * zapíše jej do výstupní oblasti,
         * předá zadaný příkaz obsluhované hře ke zpracování
         * a do výstupního pole zapíše obdržený výsledek.
         * 
         * @param e Objekt, který je schopen poskytnout informace o události,
         *          avšak v této verzi není využíván
         */
        @Override
        public void actionPerformed(ActionEvent e)
        {
            String statement = inputField.getText();
            outputArea.append(PŘED_PŘÍKAZEM + statement + ZA_PŘÍKAZEM);
            String answer = game.executeCommand(statement);
            outputArea.append(answer + '\n');
            outputArea.setCaretPosition(outputArea.getDocument().getLength());
            inputField.setText("");
        }        
    }
    
    
    
//== TESTY A METODA MAIN =======================================================

    /***************************************************************************
     * Testovací metoda předvede hraní implicitní hry
     * prostřednictvím gui - instance této třídy.
     */
    public static void test()
    {
        GUI_02   gui   = new GUI_02(null);
        IGame    gameX = _Test_101.getDefaultGame();
        _Test_101.playGameByScenario(gameX, 2, gui);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {  test();  }
}
